package com.pllandxzx.service;

import com.pllandxzx.handler.MyHandler;
import com.pllandxzx.mapper.WebSocketMapper;
import com.xsj.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.socket.TextMessage;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * WebSocket服务层
 * 提供WebSocket连接管理、消息发送和用户状态查询等功能
 * 作为控制器和处理器之间的桥梁，处理WebSocket相关的业务逻辑
 */
@Service
public class WebSocketService {

    @Autowired
    private MyHandler myHandler;

    @Autowired
    private WebSocketMapper webSocketMapper;

    /**
     * 获取所有在线用户信息
     * @return 包含用户ID和在线状态的Map
     */
    public Map<String, User> getOnlineUsers() {
        Map<String, User> onlineUsers = new ConcurrentHashMap<>();
        Map<String, org.springframework.web.socket.WebSocketSession> sessions = myHandler.getOnlineSessions();

        for (Map.Entry<String, org.springframework.web.socket.WebSocketSession> entry : sessions.entrySet()) {
            String userId = entry.getKey();
            org.springframework.web.socket.WebSocketSession session = entry.getValue();

            if (session.isOpen()) {
                User user =webSocketMapper.getUserMessage(userId);
                onlineUsers.put(userId, user);
            }
        }

        return onlineUsers;
    }

    /**
     * 获取当前在线用户数量
     * @return 在线用户数
     */
    public int getOnlineCount() {
        return myHandler.getOnlineCount();
    }

    /**
     * 向特定用户发送消息
     * @param userId 接收消息的用户ID
     * @param message 要发送的消息内容
     * @return 发送成功返回true，用户不在线或发送失败返回false
     */
    public boolean sendMessageToUser(String userId, String message) {
        Map<String, org.springframework.web.socket.WebSocketSession> sessions = myHandler.getOnlineSessions();
        org.springframework.web.socket.WebSocketSession session = sessions.get(userId);

        if (session != null && session.isOpen()) {
            try {
                session.sendMessage(new TextMessage(message));
                return true;
            } catch (IOException e) {
                System.err.println("向用户[" + userId + "]发送消息失败: " + e.getMessage());
                return false;
            }
        }

        System.out.println("用户[" + userId + "]不在线");
        return false;
    }

    /**
     * 广播消息给所有在线用户
     * @param message 要广播的消息内容
     */
    public void broadcastMessage(String message) {
        myHandler.broadcastMessage(message);
    }

    /**
     * 发送私聊消息
     * @param fromUserId 发送者用户ID
     * @param toUserId 接收者用户ID
     * @param message 要发送的消息内容
     */
    public void sendPrivateMessage(String fromUserId, String toUserId, String message) {
        myHandler.sendPrivateMessage(fromUserId, toUserId, message);
    }

    /**
     * 获取完整的在线用户信息
     * 包含在线用户数量和用户列表
     * @return 包含在线用户信息的Map
     */
    public Map<String, Object> getOnlineUserInfo() {
        Map<String, Object> result = new HashMap<>();
        result.put("count", getOnlineCount());
        result.put("users", getOnlineUsers());
        return result;
    }
}